home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / RCS / compatMapCode.c,v < prev    next >
Text File  |  1992-03-27  |  12KB  |  514 lines

  1. head     1.12;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.11.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.12
  10. date     92.03.27.12.27.06;  author shirriff;  state Exp;
  11. branches ;
  12. next     1.11;
  13.  
  14. 1.11
  15. date     90.09.11.14.30.08;  author kupfer;  state Exp;
  16. branches 1.11.1.1;
  17. next     1.10;
  18.  
  19. 1.10
  20. date     90.05.01.22.58.22;  author shirriff;  state Exp;
  21. branches ;
  22. next     1.9;
  23.  
  24. 1.9
  25. date     90.03.15.08.04.13;  author douglis;  state Exp;
  26. branches ;
  27. next     1.8;
  28.  
  29. 1.8
  30. date     90.02.22.11.06.17;  author douglis;  state Exp;
  31. branches ;
  32. next     1.7;
  33.  
  34. 1.7
  35. date     90.02.22.11.04.47;  author douglis;  state Exp;
  36. branches ;
  37. next     1.6;
  38.  
  39. 1.6
  40. date     89.09.12.11.43.51;  author nelson;  state Exp;
  41. branches ;
  42. next     1.5;
  43.  
  44. 1.5
  45. date     89.07.19.11.52.45;  author ouster;  state Exp;
  46. branches ;
  47. next     1.4;
  48.  
  49. 1.4
  50. date     89.06.21.14.49.24;  author ouster;  state Exp;
  51. branches ;
  52. next     1.3;
  53.  
  54. 1.3
  55. date     89.06.21.14.05.33;  author ouster;  state Exp;
  56. branches ;
  57. next     1.2;
  58.  
  59. 1.2
  60. date     89.06.14.15.57.17;  author ouster;  state Exp;
  61. branches ;
  62. next     1.1;
  63.  
  64. 1.1
  65. date     89.01.16.09.30.13;  author ouster;  state Exp;
  66. branches ;
  67. next     ;
  68.  
  69. 1.11.1.1
  70. date     91.08.15.17.59.37;  author kupfer;  state Exp;
  71. branches ;
  72. next     ;
  73.  
  74.  
  75. desc
  76. @Added Compat_MapToSprite procedure.
  77. @
  78.  
  79.  
  80. 1.12
  81. log
  82. @Now returns ENOMEM if process runs out of memory.
  83. @
  84. text
  85. @/*
  86.  * compatMapCode.c --
  87.  *
  88.  *     Returns the Unix error code corresponding to a Sprite ReturnStatus.
  89.  *
  90.  * Copyright 1986, 1989 Regents of the University of California
  91.  * Permission to use, copy, modify, and distribute this
  92.  * software and its documentation for any purpose and without
  93.  * fee is hereby granted, provided that the above copyright
  94.  * notice appear in all copies.  The University of California
  95.  * makes no representations about the suitability of this
  96.  * software for any purpose.  It is provided "as is" without
  97.  * express or implied warranty.
  98.  */
  99.  
  100. #ifndef lint
  101. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.11 90/09/11 14:30:08 kupfer Exp $ SPRITE (Berkeley)";
  102. #endif not lint
  103.  
  104. #ifdef KERNEL
  105. #include "sprite.h"
  106. #include "status.h"
  107. #include "compatInt.h"
  108. #include "stdlib.h"
  109. #include "stdio.h"
  110. #include "errno.h"
  111. #include "mem.h"
  112. #else
  113. #include <sprite.h>
  114. #include <status.h>
  115. #include <compatInt.h>
  116. #include <stdio.h>
  117. #include <errno.h>
  118. #endif
  119.  
  120. #ifdef KERNEL
  121. #define fprintf(fp, fmt, status) printf(fmt, status)
  122. #endif
  123.  
  124. typedef struct {
  125.     char *name;        /* ignored, but there for reference */
  126.     int  *array;    /* array of integers, one per ReturnStatus */
  127.     int   size;        /* size of array */
  128. } StatusMappings;
  129.  
  130. /*
  131.  * The tables below map the Sprite ReturnStatus values for each class
  132.  * (gen, proc, etc.) to UNIX errno's.  These tables used to be
  133.  * automatically generated but as part of the transition to the new C
  134.  * library (in 1988), the auto-generator was dropped, leaving this final
  135.  * version.  Eventually, Sprite error codes should go away entirely, leaving
  136.  * only errno's.
  137.  */
  138.  
  139. /*    /sprite/src/lib/libc/Status/gen.stat    */
  140. static int genStatusMappings[] = {
  141. 0, 0, 4, 13, 0, 22, 60, 1, 2, 4, 7, 11, 13, 14, 17, 22, 27, 28, 34, 77, };
  142.  
  143. /*    /sprite/src/lib/libc/Status/proc.stat    */
  144. static int procStatusMappings[] = {
  145. 22, 8, 0, 0, 35, 3, 1, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, };
  146.  
  147. /*    /sprite/src/lib/libc/Status/sys.stat    */
  148. static int sysStatusMappings[] = {
  149. 22, 22, 0, };
  150.  
  151. /*    /sprite/src/lib/libc/Status/rpc.stat    */
  152. static int rpcStatusMappings[] = {
  153. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  154.  
  155. /*    /sprite/src/lib/libc/Status/fs.stat    */
  156. static int fsStatusMappings[] = {
  157. 13, 22, 22, 22, 22, 9, 0, 32, 28, 0, 0, 0, 2, 35, 40, 21, 20, 1, 70, 17, 66, 62, 18, 73, 22, 22, 13, 0, 26, 29, 19, 70, 70, };
  158.  
  159. /*    /sprite/src/lib/libc/Status/vm.stat    */
  160. static int vmStatusMappings[] = {
  161. 0, 0, 0, 0, 0, 12, };
  162.  
  163. /*    /sprite/src/lib/libc/Status/sig.stat    */
  164. static int sigStatusMappings[] = {
  165. 22, 22, };
  166.  
  167. /*    /sprite/src/lib/libc/Status/dev.stat    */
  168. static int devStatusMappings[] = {
  169. 5, 6, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, 16};
  170.  
  171. /*    /sprite/src/lib/libc/Status/net.stat    */
  172. static int netStatusMappings[] = {
  173. 51, 65, 61, 54, 0, 56, 57, 48, 49, 0, 45, 42, };
  174.  
  175. static StatusMappings statusMappings[] = {
  176.     {"Gen",      genStatusMappings   ,      20},
  177.     {"Proc",      procStatusMappings  ,      17},
  178.     {"Sys",      sysStatusMappings   ,      3},
  179.     {"Rpc",      rpcStatusMappings   ,      11},
  180.     {"Fs",      fsStatusMappings    ,      33},
  181.     {"Vm",      vmStatusMappings    ,      6},
  182.     {"Sig",      sigStatusMappings   ,      2},
  183.     {"Dev",      devStatusMappings   ,      15},
  184.     {"Net",      netStatusMappings   ,      12},
  185. };
  186. static int maxNumModules = 9;
  187.  
  188.  
  189. /*
  190.  *----------------------------------------------------------------------
  191.  *
  192.  * Compat_MapCode --
  193.  *
  194.  *    Given a Sprite ReturnStatus, return the corresponding UNIX
  195.  *    errno value.
  196.  *
  197.  * Results:
  198.  *    The errno value corresponding to status is returned.  If the
  199.  *    mapping didn't work, an error message will be output and
  200.  *    EINVAL will be returned as a default.
  201.  *
  202.  * Side effects:
  203.  *    None.
  204.  *
  205.  *----------------------------------------------------------------------
  206.  */
  207.  
  208. int
  209. Compat_MapCode(status)
  210.     ReturnStatus  status;
  211. {
  212.     int module = STAT_MODULE(status);
  213.     int msg    = STAT_MSGNUM(status);
  214.     int code   = 0;
  215.  
  216.     if (status < 0) {
  217.         fprintf(stderr,
  218.         "*** compat: Cannot decode user status value 0x%x\n", status);
  219.     } else if (module >= maxNumModules) {
  220.         fprintf(stderr,
  221.         "*** compat: Invalid module # in status value 0x%x\n", status);
  222.     } else if (msg >= statusMappings[module].size) {
  223. #ifdef KERNEL
  224.         printf(
  225.         "*** compat: Invalid message # for %s module: status = 0x%x\n", 
  226.         statusMappings[module].name, status);
  227. #else
  228.         fprintf(stderr,
  229.         "*** compat: Invalid message # for %s module: status = 0x%x\n", 
  230.         statusMappings[module].name, status);
  231. #endif
  232.     } else {
  233.         code = statusMappings[module].array[msg];
  234.     }
  235.  
  236.     /*
  237.      * No mapping was found. At least return some type of error value.
  238.      */
  239.     if (code == 0 &&  status != GEN_SUCCESS) {
  240.         code = 22;  /* EINVAL */
  241.     }
  242.     return(code);
  243. }
  244.  
  245. /*
  246.  *----------------------------------------------------------------------
  247.  *
  248.  * Compat_MapToSprite --
  249.  *
  250.  *    Given a UNIX errno value, return the corresponding Sprite
  251.  *    ReturnStatus.
  252.  *
  253.  * Results:
  254.  *    The result is the Sprite ReturnStatus corresponding to
  255.  *    unixErrno.  This mapping isn't exact, in that there may
  256.  *    be several Sprite values that map to the same UNIX value,
  257.  *    but this procedure will always return a value that will
  258.  *    map back to unixErrno when passed to Compat_MapCode.
  259.  *
  260.  * Side effects:
  261.  *    None.
  262.  *
  263.  *----------------------------------------------------------------------
  264.  */
  265.  
  266. ReturnStatus
  267. Compat_MapToSprite(unixErrno)
  268.     int unixErrno;        /* A UNIX error number (e.g. EINVAL). */
  269. {
  270. #define NO_STATUS ((ReturnStatus) -1)
  271.     static int first, last;
  272.     static ReturnStatus *table;
  273.     static int initialized = 0;
  274.     int i, j, k;
  275.     ReturnStatus result;
  276.  
  277.     /*
  278.      * On the first call to this procedure, build a reverse mapping
  279.      * table from the information in statusMappings.  Do it in three
  280.      * steps:  1) scan statusMappings to find out the range of errnos
  281.      * we have to handle;  2) create and initialize the table;  3)
  282.      * scan statusMappings again to generate reverse mappings.
  283.      */
  284.  
  285.     if (!initialized) {
  286.     initialized = 1;
  287.     first = 100000;
  288.     last = -100000;
  289.     for (i = 0; i < maxNumModules; i++) {
  290.         for (j = 0; j < statusMappings[i].size; j++) {
  291.         k = statusMappings[i].array[j];
  292.         if (k < first) {
  293.             first = k;
  294.         }
  295.         if (k > last) {
  296.             last = k;
  297.         }
  298.         }
  299.     }
  300.  
  301.     table = (ReturnStatus *) malloc((unsigned)
  302.         ((last + 1 - first) * sizeof(int)));
  303.     for (i = 0; i <= last-first; i++) {
  304.         table[i] = NO_STATUS;
  305.     }
  306.  
  307.     for (i = 0; i < maxNumModules; i++) {
  308.         for (j = 0; j < statusMappings[i].size; j++) {
  309.         k = statusMappings[i].array[j] - first;
  310.         if (table[k] == NO_STATUS) {
  311.             table[k] = (i << 16) + j;
  312.         }
  313.         }
  314.     }
  315.  
  316.     /*
  317.      * Some UNIX errno's map to multiple Sprite ReturnStatus'es;  in
  318.      * some cases, the wrong Sprite status was chosen above.  Touch
  319.      * up these special cases.
  320.      */
  321.  
  322.     table[EWOULDBLOCK-first] = FS_WOULD_BLOCK;
  323.     }
  324.  
  325.     /*
  326.      * The table is set up.  Do the mapping.
  327.      */
  328.  
  329.     result = NO_STATUS;
  330.     if ((unixErrno >= first) && (unixErrno <= last)) {
  331.     result = table[unixErrno-first];
  332.     }
  333.     if (result == NO_STATUS) {
  334.     fprintf(stderr, "*** compat: unknown errno value %d\n", unixErrno);
  335.     return GEN_FAILURE;
  336.     }
  337.     return result;
  338. }
  339. @
  340.  
  341.  
  342. 1.11
  343. log
  344. @Use function prototypes.  Lint.
  345. @
  346. text
  347. @d17 1
  348. a17 1
  349. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.10 90/05/01 22:58:22 shirriff Exp Locker: kupfer $ SPRITE (Berkeley)";
  350. d77 1
  351. a77 1
  352. 0, 0, 0, 0, 0, 0, };
  353. @
  354.  
  355.  
  356. 1.11.1.1
  357. log
  358. @Initial branch for Sprite server.
  359. @
  360. text
  361. @d17 1
  362. a17 1
  363. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.11 90/09/11 14:30:08 kupfer Exp $ SPRITE (Berkeley)";
  364. @
  365.  
  366.  
  367. 1.10
  368. log
  369. @Added additional status codes for errnos used by semaphore code.
  370. @
  371. text
  372. @d17 1
  373. a17 1
  374. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.9 90/03/15 08:04:13 douglis Exp Locker: shirriff $ SPRITE (Berkeley)";
  375. d24 2
  376. d27 1
  377. @
  378.  
  379.  
  380. 1.9
  381. log
  382. @undid mistaken change for mapping.
  383. @
  384. text
  385. @d17 1
  386. a17 1
  387. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.8 90/02/22 11:06:17 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  388. d54 1
  389. a54 1
  390. 0, 0, 4, 13, 0, 22, 60, };
  391. d89 1
  392. a89 1
  393.     {"Gen",      genStatusMappings   ,      7},
  394. @
  395.  
  396.  
  397. 1.8
  398. log
  399. @forgot to increment count of mappings
  400. @
  401. text
  402. @d17 1
  403. a17 1
  404. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.7 90/02/22 11:04:47 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  405. d82 1
  406. a82 1
  407. 5, 6, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, 5, 16};
  408. d96 1
  409. a96 1
  410.     {"Dev",      devStatusMappings   ,      16},
  411. @
  412.  
  413.  
  414. 1.7
  415. log
  416. @added mapping for DEV_BUSY and changed a few others around.
  417. @
  418. text
  419. @d17 1
  420. a17 1
  421. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.6 89/09/12 11:43:51 nelson Exp Locker: douglis $ SPRITE (Berkeley)";
  422. d96 1
  423. a96 1
  424.     {"Dev",      devStatusMappings   ,      15},
  425. @
  426.  
  427.  
  428. 1.6
  429. log
  430. @changes for the ultrix compatibility port (ci by FD)
  431. @
  432. text
  433. @d17 1
  434. a17 1
  435. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.5 89/07/19 11:52:45 ouster Exp Locker: nelson $ SPRITE (Berkeley)";
  436. d54 1
  437. a54 1
  438. 0, 0, 4, 13, 0, 22, 0, };
  439. d82 1
  440. a82 1
  441. 5, 6, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, 16, };
  442. @
  443.  
  444.  
  445. 1.5
  446. log
  447. @Map to/from ENXIO properly.
  448. @
  449. text
  450. @d17 1
  451. a17 1
  452. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.4 89/06/21 14:49:24 ouster Exp $ SPRITE (Berkeley)";
  453. d20 6
  454. d31 1
  455. d33 4
  456. d136 5
  457. d144 1
  458. @
  459.  
  460.  
  461. 1.4
  462. log
  463. @Forgot to update all tables for previous change.
  464. @
  465. text
  466. @d17 1
  467. a17 1
  468. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.3 89/06/21 14:05:33 ouster Exp $ SPRITE (Berkeley)";
  469. d71 1
  470. a71 1
  471. 5, 22, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, 16, };
  472. @
  473.  
  474.  
  475. 1.3
  476. log
  477. @Added EBUSY mapping.
  478. @
  479. text
  480. @d17 1
  481. a17 1
  482. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.2 89/06/14 15:57:17 ouster Exp Locker: ouster $ SPRITE (Berkeley)";
  483. d85 1
  484. a85 1
  485.     {"Dev",      devStatusMappings   ,      14},
  486. @
  487.  
  488.  
  489. 1.2
  490. log
  491. @Make sure EWOULDBLOCK maps to FS_WOULD_BLOCK.
  492. @
  493. text
  494. @d17 1
  495. a17 1
  496. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.1 89/01/16 09:30:13 ouster Exp Locker: ouster $ SPRITE (Berkeley)";
  497. d71 1
  498. a71 1
  499. 5, 22, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, };
  500. @
  501.  
  502.  
  503. 1.1
  504. log
  505. @Initial revision
  506. @
  507. text
  508. @d17 1
  509. a17 1
  510. static char rcsid[] = "$Header: compatMapCode.c.1,v 1.2 88/08/05 16:12:43 ouster Exp $ SPRITE (Berkeley)";
  511. d24 1
  512. d211 8
  513. @
  514.